package com.cookie.utils;

import com.cookie.config.RedisConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 处理单机模式下的redis
 */
public class RedisSingleUtil {
    // Redis服务器IP, 端口号，密码
    private String addr;
    private int port;
    private String auth;

    // 可用连接实例的最大数目，默认值为8；
    // 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
    private int maxActive;
    // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8。
    private int maxIdle;
    // 等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
    private int maxWait;
    // 过期时间, 这里没有用到
    protected static int  expireTime = 60 * 60 *24;

    // 连接池
    protected JedisPool pool;

    public RedisSingleUtil(RedisConfig redisConf){
        addr = redisConf.getIp();
        port = redisConf.getPort();
        auth = redisConf.getAuth();

        maxActive = redisConf.getMaxActive();
        maxIdle = redisConf.getMaxIdle();
        maxWait = redisConf.getMaxWait();

        JedisPoolConfig config = new JedisPoolConfig();
        //最大连接数
        config.setMaxTotal(maxActive);
        //最多空闲实例
        config.setMaxIdle(maxIdle);
        //超时时间
        config.setMaxWaitMillis(maxWait);
        //
        config.setTestOnBorrow(false);
        // 创建连接池
        pool = new JedisPool(config, addr, port, 1000, auth);
    }

    protected Jedis getJedis() {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
        } catch (Exception e) {
            e.printStackTrace();
            if (jedis != null) {
                // pool.returnBrokenResource(jedis);
                jedis.close();
            }
        }
        return jedis;
    }
    /**
     * 释放jedis资源,直接close
     *
     * @param jedis
     */
    protected void closeResource(Jedis jedis) {
        if (jedis != null){
            jedis.close();
        }
    }
    /**
     *  是否存在key
     */
    public boolean existKey(String key) {
        Jedis jedis = null;

        try {
            jedis = getJedis();
            jedis.select(0);
            return jedis.exists(key);
        } catch (Exception e) {

        } finally {
            closeResource(jedis);
        }
        return false;
    }
    /**
     *  删除key
     */
    public void delKey(String key) {
        Jedis jedis = null;

        try {
            jedis = getJedis();
            jedis.select(0);
            jedis.del(key);
        } catch (Exception e) {

        } finally {
            closeResource(jedis);
        }
    }
    /**
     *  取得string类型的key值
     */
    public String stringGet(String key) {
        Jedis jedis = null;

        String lastVal = null;
        try {
            jedis = getJedis();
            jedis.select(0);
            lastVal = jedis.get(key);
            // jedis.expire(key, expireTime);
        } catch (Exception e) {

        } finally {
            closeResource(jedis);
        }
        return lastVal;
    }
    /**
     *  添加string数据
     *
     */
    public String stringSet(String key, String value) {
        Jedis jedis = null;

        String lastVal = null;
        try {
            jedis = getJedis();
            jedis.select(0);
            lastVal = jedis.set(key, value);
            // jedis.expire(key, expireTime); 这里为什么要设置过期时间
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource(jedis);
        }
        return lastVal;
    }
    /**
     *  添加hash数据
     *
     */
    public void hashSet(String key, String field, String value) {

        Jedis jedis = null;
        try {
            jedis = getJedis();
            if (jedis != null) {
                jedis.select(0);
                jedis.hset(key, field, value);
                // jedis.expire(key, expireTime);
            }
        } catch (Exception e) {
            // 如果value为空，则会出现异常，但被这里catch了，所以也就没有提示
            // 而这条异常的field-value也就没有被插入进去
            // 全量同步用的是rs.getString(i), 获取到的是null,
            // 增量同步用的是column.getValue(),获取到的是空串
            e.printStackTrace();
        } finally {
            closeResource(jedis);
        }
    }
}
